単純線形回帰モデル



以下の真のモデルを考える。 \[ y_i = \alpha^{true} + \beta^{true} x_i + \epsilon_i \quad,\quad \epsilon_i \sim Normal\,(0,{\sigma^{true}}^2) \]
 


ベイジアンは、係数 \(\alpha^{true} , \beta^{true}\) について確率変数 \(\alpha,\beta\) の実現値、つまり「確率分布から実現した値」と考える。

この値は当然誰にもわからないため、事前分布(prior distribution)と尤度(likelihood ; データより算出)を基に \(\alpha,\beta\) が従う確率分布を計算することで、確率変数 \(\alpha,\beta\) について、どの値が「実現しやすいか」を明らかにする。

この計算後の確率分布は一般的に事後分布(posterior distribution)と呼ばれる。

ここで、 \(\epsilon_i\) について分布が仮定されていることに注意。さらにその標準偏差 \(\sigma^{true}\) も推測したいため、確率変数 \(\sigma\) の実現した値として考える。



確率分布(=事後確率密度関数)がなぜ計算できるのか?


ベイズの定理により式としては簡単に導出可能。

(1変数) 確率変数 \(\beta\) のある特定の \(\beta^{*}\) における事後確率密度は


\[ \begin{eqnarray} f(\,\beta=\beta^{*}\,|\,Data\,) &=& \frac{ \,f(\,Data\,|\,\beta=\beta^{*}\,) \cdot f(\,\beta=\beta^{*}\,)}{f(Data)}\\ \\ &=& \frac{f(\,Data\,|\,\beta=\beta^{*}\,) \cdot f(\,\beta=\beta^{*}\,)}{\int_{-\infty}^{\infty} \,f(\,Data\,|\,\beta=\beta^{real}\,) \cdot f(\,\beta=\beta^{real}\,)\,\,d\beta^{real}} \end{eqnarray} \]


ここで

\(f(\,\beta=\beta^{*}\,)\)  …  事前確率密度 (データ取得前の確率変数 \(\beta\) のある特定の \(\beta^{*}\) における確率密度)

\(f(\,Data\,|\,\beta=\beta^{*}\,)\)  …  尤度 (確率変数 \(\beta\) がある特定の値 \(\beta^{*}\) をとるときの手元のデータが得られる確率(密度))

\(\int_{-\infty}^{\infty} \,f(\,Data\,|\,\beta=\beta^{real}\,)\cdot f(\,\beta=\beta^{real}\,)\,\,d\beta^{real}\) … 手元のデータが得られる確率(密度)であり、確率変数 \(\beta\) がとり得る実現値 \(\beta^{real}\) の全てについて
                                          事前分布の下その値が実現し、かつその値の下で手元のデータが得られる確率(密度)を
                                          合計している


(多変数ver) 確率変数 \(\alpha,\beta,\sigma\) のある特定の \(\alpha^{*},\beta^{*},\sigma^{*}\) における事後(同時)確率密度は

\[ \begin{eqnarray} f(\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,|\,Data\,) &=& \frac{ \,f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,) \cdot f(\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,)}{f(Data)}\\ \\ &=& \frac{f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,) \cdot f(\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,)}{\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,Data\,|\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,) \cdot f(\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,)\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real}} \end{eqnarray} \]

推定してみる


1. 尤度


まずは尤度を考える。

尤度とは、あるパラメータの下で手元のデータが手に入る確率(のようなもの)である。 1つのデータ \((x_1,y_1)\) が手に入ったとき、\(\alpha = \alpha^{*},\beta=\beta^{*},\sigma = \sigma^{*}\)のもとでそのデータが手に入る確率は \[ \begin{eqnarray} y_1 = \alpha^{*} + \beta^{*} x_1 + \epsilon_i \quad,\quad \epsilon_i \sim Normal\,(0,{\sigma^{*}}^2) \end{eqnarray} \] より \[ \begin{eqnarray} \epsilon_i =\,\, &y_1 - (\alpha^{*} + \beta^{*} x_1)& \quad,\quad \epsilon_i \sim Normal\,(0,{\sigma^{*}}^2)\\ \\ &y_1 - (\alpha^{*} + \beta^{*} x_1)& \,\sim Normal\,(0,{\sigma^{*}}^2)\\ \end{eqnarray} \] よって \[ \begin{eqnarray} f((x_1,y_1)\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}) = \frac{1}{\sqrt{2\pi}\sigma^{*}} \, \exp\left[-\frac{\{y_1-(\alpha^{*} + \beta^{*} x_1)\}-0}{2{\sigma^{*}}^2}\right] \end{eqnarray} \]

これが「尤度」となる。(\(\alpha^{*},\beta^{*},\sigma^{*}\) を色々変えることで尤度関数が手に入る)


同様に、\(N\)個の独立なデータ \((x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\) が手に入ったとき、\(\alpha = \alpha^{*},\beta=\beta^{*},\sigma = \sigma^{*}\) のもとでそのデータが手に入る確率はそのデータが手に入る確率は

\[ \begin{eqnarray} f((x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}) &=& f((x_1,y_1)\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*})\cdot f((x_2,y_2)\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*})\cdot \,\, ... \,\\ \\ &=& \prod_{i=0}^{N}\frac{1}{\sqrt{2\pi}\sigma^{*}} \, \exp\left[-\frac{\{y_i-(\alpha^{*} + \beta^{*} x_i)\}-0}{2{\sigma^{*}}^2}\right] \end{eqnarray} \]

\(N\)個のデータの場合はこれが「尤度」になる。


2. 事前分布


次に「事前分布」(事前確率密度関数)を考える。


2-1. 事前分布の設定の考え方

基本的には、「事前分布」には分析前の時点で \(\alpha,\beta\) が従うと考えられる確率分布を設定すべきである。

一方で、その設定には注意が必要である。
というのも、尤度と相性の悪い事前分布を設定すると事後確率密度の式 \(f(\,\beta=\beta^{*}\,|\,Data\,)= \frac{f(\,Data\,|\,\beta=\beta^{*}\,) \cdot f(\,\beta=\beta^{*}\,)}{\int_{-\infty}^{\infty} \,f(\,Data\,|\,\beta=\beta^{real}\,) \cdot f(\,\beta=\beta^{real}\,)\,\,d\beta^{real}}\) が複雑になりすぎてしまい、分母の積分をClosed Formにできないのである。この場合、MCMCが必要になる。


豊田 編著(2015)によると設定には2つの方針がある。

①「自然共役事前分布 (Conjugated Prior Distribution)」

こちらは事後分布の計算のしやすさを重視する方針である。 この場合、事後分布が「知っている分布」になるため、MCMCをせずともその期待値、最頻値などがすぐに求まるというメリットがある。
(MCMC(特にHMC法)が簡単にできる現在において求めやすい事後分布にする必要性は無いともいえるが)

尤度 自然共役事前分布 事後分布
正規分布(平均) 正規分布 正規分布
正規分布(分散) 逆ガンマ分布  逆ガンマ分布
ベルヌーイ分布 ベータ分布  ベータ分布
2項分布 ベータ分布  ベータ分布
ポアソン分布 ガンマ分布  ガンマ分布
出所:豊田 編著(2015)をもとに発表者が作成


今回の場合 → 正規分布の平均をモデル化し尤度を計算しているので事前分布に正規分布?


②「無情報事前分布 (Non-informative Prior Distribution)」

①の方針は、「事後分布が求めやすいように」事前分布を設定するという点で恣意的だという批判がある。Box and Tiao(1973) によって事後分布にできるだけ影響を与えない事後分布を設定するという考え方が提案された。

例: \((-\infty,\infty)\) の一様分布

・どんな分布?

一般に、\((a,b)\) の一様分布に従う \(\beta\) の確率密度関数は、

\[ f(\beta=\beta^{*}) = \frac{1}{b-a} = \, C \, (定数) \]

ここで \(a \to -\infty, \, b \to \infty\) とすると

\[ f(\beta = \beta^{*}) = \,C\, = \lim_{a\to -\infty, b\to \infty}\frac{1}{b-a} = \,0 \]

となり確率密度がどこでも \(0\) になってしまう。( →変則分布(Improper Distribution))

事前確率密度がどこでも \(0\) のとき、事後確率密度もどこでも \(0\)   (\(\because 事後確率密度の分子 = 尤度 ×事前確率密度\))
→ 尤度の情報が消えてしまう

この問題に対処するには

  • \(C\)\(0\) ではなくとてもとても小さな値 \(\delta\) とみなす。

  • \((a,b)\) の一様分布で、十分に小さな \(a\) 、十分に大きな \(b\) を設定。  (例: \(a=-10000,\, b=10000,\, C=\frac{1}{20000}\)

前者は積分して1にならない(無限大になる)点に注意 (手続き上問題はない)。後者の方針の方が数理的に破綻が無いとされる。

いずれにしてもその区間がパラメータの定義域を全て覆うような一様分布を事前分布として用いた時の事後確率密度関数(確率変数\(\sigma\)は省略)は、

\[ \begin{eqnarray} f(\,\alpha=\alpha^{*},\beta=\beta^{*}\,|\,Data\,) &=& \frac{ \,f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*}\,) \cdot f(\,\alpha=\alpha^{*},\beta=\beta^{*}\,)}{f(Data)}\\ \\ &=& \frac{f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*}\,) \cdot f(\,\alpha=\alpha^{*},\beta=\beta^{*}\,)}{\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,Data\,|\,\alpha=\alpha^{real},\beta=\beta^{real}\,) \cdot f(\,\alpha=\alpha^{real},\beta=\beta^{real}\,)\,\,d\alpha^{real}\,d\beta^{real}} \\ \\ &=& \frac{f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*}\,) \cdot C}{\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,Data\,|\,\alpha=\alpha^{real},\beta=\beta^{real}\,) \cdot C\,\,d\alpha^{real}\,d\beta^{real}}\\ \\ &=& \frac{C \cdot f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*}\,)}{C \cdot \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,Data\,|\,\alpha=\alpha^{real},\beta=\beta^{real}\,)\,d\alpha^{real}\,d\beta^{real}}\\ \\ &=& \frac{f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*}\,)}{ \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,Data\,|\,\alpha=\alpha^{real},\beta=\beta^{real}\,)\,d\alpha^{real}\,d\beta^{real}}\\ \\ &\propto& f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*}\,) \end{eqnarray} \]
となり、完全に尤度に比例する。 (\(\therefore カーネル = 尤度\))

豊田 編著(2015)では、「公的」な分析に関しては一般に広く認められた事前信念がない限りこうした情報の少ない事前分布を使うべきとしている。(一様分布のほか、コーシー分布、半コーシー分布など)


2-2. 今回のモデルにおける事前分布


事前分布が3変量確率分布であることに注意。

確率変数 \(\alpha,\beta\)\((a,b)\) の一様分布を採用(ただし、\(a\)はとても小さい値、\(b\)はとても大きい値)

確率変数 \(\sigma\)\((0,b)\) の一様分布を採用(ただし、\(b\)はとても大きい値)

→ 範囲内においてどこでも密度は \(C=\frac{1}{(b-a)^2b}\) で一定

\(\left(C=\frac{1}{(b-a)^2b}\, の証明\right)\) \[ \begin{eqnarray} \int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} f(\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,)\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real} &=& 1\\ \\ \int_{0}^{b}\int_{a}^{b}\int_{a}^{b} C\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real} &=& 1\\ (\because \,\, f(\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,) &=& C \,(一定))\\\ \\ C \cdot \int_{0}^{b}\int_{a}^{b}\int_{a}^{b} 1\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real} &=& 1\\ \\ C \cdot \int_{0}^{b}\int_{a}^{b} [\alpha^{real}]_a^b \,\,d\beta^{real}\,d\sigma^{real} &=& 1\\ \\ C \cdot \int_{0}^{b}\int_{a}^{b} (b-a) \,\,d\beta^{real}\,d\sigma^{real} &=& 1\\ \\ C \cdot (b-a)\int_{0}^{b} [\beta^{real}]_a^b \,\,d\sigma^{real} &=& 1\\ \\ C \cdot (b-a)\int_{0}^{b} (b-a) \,\,d\sigma^{real} &=& 1\\ \\ C \cdot (b-a)^2 \,\, [\sigma^{real}]_0^b &=& 1\\ \\ C \cdot (b-a)^2b &=& 1\\ \\ C &=& \frac{1}{(b-a)^2b} \end{eqnarray} \]


3. カーネルの計算


\(N\)個の独立なデータ \((x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\) が手に入ったときのカーネルは、

\[ \begin{eqnarray} f(\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,|\,Data\,) &\propto& \,f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,) \cdot f(\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,)\\ \\ &\fallingdotseq& f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,) \cdot C \\ \\ &\propto& \,f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,)\\ \\ &=& f((x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*})\\ \\ &=& \prod_{i=0}^{N}\frac{1}{\sqrt{2\pi}\sigma^{*}} \, \exp\left[-\frac{\{y_i-(\alpha^{*} + \beta^{*} x_i)\}-0}{2{\sigma^{*}}^2}\right]\\ \\ &=& \prod_{i=0}^{N}\frac{1}{\sqrt{2\pi}\sigma^{*}} \, \exp\left(-\frac{y_i - \alpha^{*} - \beta^{*} x_i}{2{\sigma^{*}}^2}\right)\\ \\ \end{eqnarray} \]

(参考)事後確率密度関数は、

\[ \begin{eqnarray} f(\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,|\,Data\,) &=& \frac{f(\,Data\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,) \cdot f(\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,)}{\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,Data\,|\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,) \cdot f(\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,)\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real}}\\ \\ &=& \frac{f(\,(x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,) \cdot C}{C \cdot \int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,(x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\,|\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,) \,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real}}\\ \\ &=& \frac{f(\,(x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\,|\,\alpha=\alpha^{*},\beta=\beta^{*},\sigma=\sigma^{*}\,) }{\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \,f(\,(x_1,y_1),(x_2,y_2),\,...\, ,(x_N,y_N)\,|\,\alpha=\alpha^{real},\beta=\beta^{real},\sigma=\sigma^{real}\,) )\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real}}\\ \\ &=& \frac{\prod_{i=0}^{N}\frac{1}{\sqrt{2\pi}\sigma^{*}} \, \exp\left(-\frac{y_i - \alpha^{*} - \beta^{*} x_i}{2{\sigma^{*}}^2}\right)}{\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \prod_{i=0}^{N}\frac{1}{\sqrt{2\pi}\sigma^{real}} \, \exp\left(-\frac{y_i - \alpha^{real} - \beta^{real} x_i}{2{\sigma^{real}}^2}\right)\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real}} \end{eqnarray} \]


4. データを使った推定(MCMCしない)


\((5,13),(2,6),(4,10),(9,17),(4,8)\) というデータが手に入ったとして推定。

x_obs <- c(5,2,4,9,4)
y_obs <- c(13,6,10,17,8)
d <- data.frame(x=x_obs,y=y_obs)
head(d)
##   x  y
## 1 5 13
## 2 2  6
## 3 4 10
## 4 9 17
## 5 4  8
g_s <- ggplot(d,aes(x=x,y=y)) + geom_point() + ggtitle("observation")
plot(g_s)



事前分布

事前分布の一様分布において、便宜上\(a=-10000,b=10000\)とする。

density_c <- 1/(20000*20000*10000)

alpha_real <- seq(-10,10,0.1)
prior_a <-  rep(density_c,length(alpha_real))
plot(alpha_real,prior_a)

beta_real <- seq(-10,10,0.1)
prior_b <-  rep(density_c,length(beta_real))
plot(beta_real,prior_b)

sigma_real <- seq(0,10,0.1)
prior_s <-  rep(density_c,length(sigma_real))
plot(sigma_real,prior_s)

prior_ab <- matrix(density_c,nrow=length(alpha_real),ncol=length(beta_real))

\(\alpha,\beta\) の2次元で見ると

library(plotly)
fig <- plot_ly(x=~beta_real,y=~alpha_real, z=~prior_ab) %>% layout(scene=list(zaxis=list(nticks=4,range=c(0,1/2000000000000))))
fig <- fig %>% add_surface()
fig



尤度関数

#likelihood function
likelihood_f <- function(alpha,beta,sigma){
  return(prod(dnorm(y_obs-alpha-beta*x_obs,mean=0,sd=sigma)))
}

likelihoods <- array(0,dim=c(length(alpha_real),length(beta_real),length(sigma_real)))
kernels <- array(0,dim=c(length(alpha_real),length(beta_real),length(sigma_real)))

for (i in 1:length(alpha_real)){
  for (j in 1:length(beta_real)) {
    for (k in 1:length(sigma_real)) {
      likelihoods[i,j,k] <- likelihood_f(alpha_real[i],beta_real[j],sigma_real[k])
      kernels[i,j,k] <- likelihoods[i,j,k]*density_c
    }
  }
}



尤度・カーネルの「最大値」と「最大値になるパラメータの値(MAP推定量)」

print(likelihoods[which.max(likelihoods)])
## [1] 0.0004365827
print(kernels[which.max(kernels)])
## [1] 1.091457e-16
print(which(likelihoods==likelihoods[which.max(likelihoods)],arr.ind = TRUE))
##      dim1 dim2 dim3
## [1,]  132  117   12
print(which(kernels==kernels[which.max(kernels)],arr.ind = TRUE))
##      dim1 dim2 dim3
## [1,]  132  117   12
print(alpha_real[132])
## [1] 3.1
print(beta_real[117])
## [1] 1.6
print(sigma_real[12])
## [1] 1.1
#plot
d <- data.frame(alpha=alpha_real,density=kernels[,117,12])
g_a <- ggplot(d,aes(x=alpha,y=density)) + geom_line() + ggtitle("alpha kernel")
plot(g_a)

d <- data.frame(beta=beta_real,density=kernels[132,,12])
g_b <- ggplot(d,aes(x=beta,y=density)) + geom_line() + ggtitle("beta kernel")
plot(g_b)

d <- data.frame(sigma=sigma_real,density=kernels[132,117,])
g_s <- ggplot(d,aes(x=sigma,y=density)) + geom_line() + ggtitle("sigma kernel")
plot(g_s)

fig_2 <- plot_ly(x=~beta_real,y=~alpha_real,z=~kernels[ , ,12]) 
fig_2 <- fig_2 %>% add_surface()
fig_2
fig_3 <- plot_ly(x=~sigma_real,y=~beta_real,z=~kernels[132, , ])
fig_3 <- fig_3 %>% add_surface()
fig_3
fig_4 <- plot_ly(x=~sigma_real,y=~alpha_real,z=~kernels[ ,117, ])
fig_4 <- fig_4 %>% add_surface()
fig_4



最小二乗法による推定値

d <- data.frame(x=x_obs,y=y_obs)
g_s <- ggplot(d,aes(x=x,y=y)) + geom_point() + ggtitle("observation")
plot(g_s)

ols <- lm(y~x,data=d)
print(summary(ols))
## 
## Call:
## lm(formula = y ~ x, data = d)
## 
## Residuals:
##       1       2       3       4       5 
##  1.8806 -0.3284  0.4776 -0.5075 -1.5224 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   3.1343     1.5092   2.077    0.129  
## x             1.5970     0.2832   5.639    0.011 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.466 on 3 degrees of freedom
## Multiple R-squared:  0.9138, Adjusted R-squared:  0.8851 
## F-statistic:  31.8 on 1 and 3 DF,  p-value: 0.01103
mean(ols$residuals^2)
## [1] 1.289552




5. データを使った推定(stanによるMCMC)



5-1. パラメータ推定

library(rstan)
library(bayesplot)

#rstan_options(auto_write = TRUE)
options(mc.core = parallel::detectCores())



以下の通り「simple_reg_0507.stan」ファイルを作成

data {
  int<lower=0> N;
  vector[N] x;
  vector[N] y;
}


parameters {
  real alpha;
  real beta;
  real<lower=0> sigma;
}


model {
  y ~ normal(alpha + beta*x, sigma);
}



ここでmodelブロックについて、 \[ y_i = \alpha^{true} + \beta^{true} x_i + \epsilon_i \quad,\quad \epsilon_i \sim Normal\,(0,{\sigma^{true}}^2)\\ \] より \[ y_i \sim Normal\,(\,\alpha^{true} + \beta^{true} x_i\,,\,{\sigma^{true}}^2\,)\\ \] と変形して記述することに注意。

また、事前分布は「幅の広い一様分布」を採用するので、何も指定しない。

listを作る

data_list <- list(
  N = 5,
  y = y_obs,
  x = x_obs
)



MCMCを実行

mcmc_result <- stan(
  file = "simple_reg_0507.stan",
  data = data_list,
  seed = 1,
  chains = 4,
  warmup = 1000,
  iter = 2000,
  thin = 1
)
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 1).
## Chain 1: 
## Chain 1: Gradient evaluation took 5.8e-05 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 0.58 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1: 
## Chain 1: 
## Chain 1: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 1: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 1: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 1: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 1: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 1: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 1: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 1: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 1: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 1: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 1: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 1: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 1: 
## Chain 1:  Elapsed Time: 0.133 seconds (Warm-up)
## Chain 1:                0.106 seconds (Sampling)
## Chain 1:                0.239 seconds (Total)
## Chain 1: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 2).
## Chain 2: 
## Chain 2: Gradient evaluation took 1.5e-05 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 0.15 seconds.
## Chain 2: Adjust your expectations accordingly!
## Chain 2: 
## Chain 2: 
## Chain 2: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 2: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 2: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 2: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 2: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 2: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 2: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 2: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 2: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 2: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 2: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 2: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 2: 
## Chain 2:  Elapsed Time: 0.14 seconds (Warm-up)
## Chain 2:                0.162 seconds (Sampling)
## Chain 2:                0.302 seconds (Total)
## Chain 2: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 3).
## Chain 3: 
## Chain 3: Gradient evaluation took 1.3e-05 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 0.13 seconds.
## Chain 3: Adjust your expectations accordingly!
## Chain 3: 
## Chain 3: 
## Chain 3: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 3: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 3: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 3: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 3: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 3: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 3: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 3: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 3: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 3: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 3: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 3: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 3: 
## Chain 3:  Elapsed Time: 0.135 seconds (Warm-up)
## Chain 3:                0.076 seconds (Sampling)
## Chain 3:                0.211 seconds (Total)
## Chain 3: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 4).
## Chain 4: 
## Chain 4: Gradient evaluation took 1.3e-05 seconds
## Chain 4: 1000 transitions using 10 leapfrog steps per transition would take 0.13 seconds.
## Chain 4: Adjust your expectations accordingly!
## Chain 4: 
## Chain 4: 
## Chain 4: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 4: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 4: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 4: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 4: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 4: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 4: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 4: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 4: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 4: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 4: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 4: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 4: 
## Chain 4:  Elapsed Time: 0.124 seconds (Warm-up)
## Chain 4:                0.13 seconds (Sampling)
## Chain 4:                0.254 seconds (Total)
## Chain 4:



結果とMCMCサンプルの抽出

print(mcmc_result, probs = c(0.025,0.5,0.975))
## Inference for Stan model: anon_model.
## 4 chains, each with iter=2000; warmup=1000; thin=1; 
## post-warmup draws per chain=1000, total post-warmup draws=4000.
## 
##        mean se_mean   sd   2.5%   50% 97.5% n_eff Rhat
## alpha  2.81    0.21 4.22  -5.88  3.07  9.21   415 1.01
## beta   1.65    0.04 0.76   0.40  1.61  3.24   427 1.00
## sigma  2.89    0.18 3.14   0.88  2.07  9.87   310 1.01
## lp__  -5.34    0.13 1.99 -10.60 -4.78 -3.15   237 1.01
## 
## Samples were drawn using NUTS(diag_e) at Fri May 07 14:22:03 2021.
## For each parameter, n_eff is a crude measure of effective sample size,
## and Rhat is the potential scale reduction factor on split chains (at 
## convergence, Rhat=1).
mcmc_sample <- rstan::extract(mcmc_result,permuted=FALSE)



トレースプロットと事後分布

mcmc_combo(
  mcmc_sample,
  pars = c("alpha","beta","sigma")
)




5-2.事後予測



条件付き予測分布



通常の単回帰モデルの予測 \[ \hat{y_{next}} = \hat{\alpha} + \hat{\beta}x_{next} \] \(\hat{\alpha} , \hat{\beta}\)\(\alpha^{true} , \beta^{true}\) の点推定値 \(x_{next}\)\(y_{next}\) の予測に用いる \(x\) の値

ベイズ推定でも、事後中央値や事後平均値を点推定値として、こうした予測をすることは可能

さらにベイジアンは誤差項に分布を仮定するので「予測分布」を出せる → 条件付き予測分布(Conditional Predictive Distribution)

条件付き予測分布の期待値は \[ E\left[\hat{y_{next}}\right | \,\hat{\alpha},\hat{\beta}\,,\hat{\sigma}\,] = \hat{\alpha} + \hat{\beta}x_{next} \]

条件付き予測分布は平均 \(\hat{\alpha}+\hat{\beta}x_{next}\), 分散 \(\hat{\sigma}\) の正規分布

つまり、条件付き予測分布において、\(\hat{y_{next}}\) がある特定の値 \(y^{*}\) をとる確率密度は \[ f(\hat{y_{next}} = y^{*}| \,\hat{\alpha},\hat{\beta},\hat{\sigma},x_{next}\,) = \frac{1}{\sqrt{2\pi}\hat{\sigma}} \, \exp\left[-\frac{\,(\hat{\alpha} + \hat{\beta}x_{next})-y^{*}}{2{\hat{\sigma}^2}}\right] \]

事後予測分布



パラメータの点推定値だけでなく分布が手に入る → 予測においてもこの分布の情報を活用したい

パラメータの分布を考慮したうえで導出する予測分布 → 事後予測分布(Posterior Predictive Distribution)

(実現値 \(\alpha^{real},\beta^{real},\sigma^{real}\) の下で \(y\hat{y_{next}\)\(y^{*}\) をとる確率密度)× (その \(\alpha^{real},\beta^{real},\sigma^{real}\) が実現する確率密度 (=事後確率密度) )をすべての \(\alpha^{real},\beta^{real},\sigma^{real}\) について足し合わせる

→ \(y\hat{y_{next}\)\(y^{*}\) をとる確率密度が出てくるはず

\[ \begin{eqnarray} f(\hat{y_{next}} = y^{*}|Data,x_{next}) &=& \int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \underset{\hat{y_{next}} = y^{*}となる条件付き確率密度}{\underline{f(\hat{y_{next}} = y^{*}| \,\alpha^{real},\beta^{real},\sigma^{real}\,,x_{next})}}\cdot \underset{事後確率密度}{\underline{f(\,\alpha = \alpha^{real},\,\beta = \beta^{real},\,\sigma = \sigma^{real}|\,Data\,)}}\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real}\\ \\ \\ &=& \int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \frac{1}{\sqrt{2\pi}\sigma^{real}} \, \exp\left[-\frac{\,(\alpha^{real}+\beta^{real}x_{next})-y^{*}}{2{{\sigma^{real}}^2}}\right]\cdot \frac{\prod_{i=0}^{N}\frac{1}{\sqrt{2\pi}\sigma^{real}} \, \exp\left(-\frac{y_i - \alpha^{real} - \beta^{real} x_i}{2{\sigma^{*}}^2}\right)}{\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty} \prod_{i=0}^{N}\frac{1}{\sqrt{2\pi}\sigma^{real}} \, \exp\left(-\frac{y_i - \alpha^{real} - \beta^{real} x_i}{2{\sigma^{real}}^2}\right)\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real}}\,\,d\alpha^{real}\,d\beta^{real}\,d\sigma^{real} \end{eqnarray} \]

→ 非常に複雑なので、こちらの事後予測分布も乱数をサンプリングすることで推測する

事後予測分布の推測の流れ

  • MCMCにより\((\alpha^{real},\beta^{real},\sigma^{real})\) セットを4000組(ここはiter,chains次第だが)得ているはず

    → (事後確率密度関数の近似に対応)

  • 予測用の\(x_{next}\)について、4000組それぞれに \(\alpha^{real} + \beta^{real}x_{next}\) を計算 (\(x_{next}\) は固定)

  • 正規分布の乱数発生プログラムを用いて、\(Normal(\alpha^{real} + \beta^{real}x_{next},{\sigma^{real}}^2)\) を1組につき1つ発生させ,予測値 \(\hat{y_{next}}\) とする

    → (条件付き密度関数の近似に対応)

  • 得られた4000個の予測値 \(\hat{y_{next}}\) でヒストグラムを描き、\(x_{next}\) による \(y_{next}\) の予測分布とする

実際にこの手続きを行うには、「.stan」ファイルを

data {
  int<lower=0> N;
  vector[N] x;
  vector[N] y;
  
  int N_p;            //予測するデータ(x)の数
  vector[N_p] x_next; //予測に用いるxのベクトル
}


parameters {
  real alpha;
  real beta;
  real<lower=0> sigma;
}


model {
  y ~ normal(alpha + beta*x, sigma);
}

generated quantities{
  vector[N_p] y_next_hat;  //yの予測値
  
  y_next_hat = normal_rng(alpha + beta*x_next, sigma);
  //Normal(alpha + beta*x_next, sigma)から乱数を発生
  //それをyの予測値とする
}

と変更する必要がある

(変更後のファイルは「simple_reg_pred_0507.stan」として新しく保存)

generated quantities ブロックについて

モデルによる予測値など、「モデル・パラメータの推定には必要ないが別の目的で乱数を得たい object」を定義する。

data_list

data_list_pred <- list(
  N = 5,
  y = y_obs,
  x = x_obs,
  N_p = 5,
  x_next = c(4,8,12,1,5.5)
)


mcmcの実行

mcmc_result_pred <- stan(
  file = "simple_reg_pred_0507.stan",
  data = data_list_pred,
  seed = 1
)
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 1).
## Chain 1: 
## Chain 1: Gradient evaluation took 7.9e-05 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 0.79 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1: 
## Chain 1: 
## Chain 1: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 1: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 1: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 1: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 1: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 1: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 1: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 1: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 1: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 1: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 1: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 1: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 1: 
## Chain 1:  Elapsed Time: 0.156 seconds (Warm-up)
## Chain 1:                0.171 seconds (Sampling)
## Chain 1:                0.327 seconds (Total)
## Chain 1: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 2).
## Chain 2: 
## Chain 2: Gradient evaluation took 1.5e-05 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 0.15 seconds.
## Chain 2: Adjust your expectations accordingly!
## Chain 2: 
## Chain 2: 
## Chain 2: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 2: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 2: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 2: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 2: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 2: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 2: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 2: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 2: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 2: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 2: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 2: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 2: 
## Chain 2:  Elapsed Time: 0.163 seconds (Warm-up)
## Chain 2:                0.161 seconds (Sampling)
## Chain 2:                0.324 seconds (Total)
## Chain 2: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 3).
## Chain 3: 
## Chain 3: Gradient evaluation took 1.4e-05 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 0.14 seconds.
## Chain 3: Adjust your expectations accordingly!
## Chain 3: 
## Chain 3: 
## Chain 3: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 3: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 3: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 3: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 3: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 3: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 3: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 3: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 3: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 3: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 3: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 3: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 3: 
## Chain 3:  Elapsed Time: 0.154 seconds (Warm-up)
## Chain 3:                0.157 seconds (Sampling)
## Chain 3:                0.311 seconds (Total)
## Chain 3: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 4).
## Chain 4: 
## Chain 4: Gradient evaluation took 1.5e-05 seconds
## Chain 4: 1000 transitions using 10 leapfrog steps per transition would take 0.15 seconds.
## Chain 4: Adjust your expectations accordingly!
## Chain 4: 
## Chain 4: 
## Chain 4: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 4: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 4: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 4: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 4: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 4: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 4: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 4: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 4: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 4: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 4: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 4: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 4: 
## Chain 4:  Elapsed Time: 0.171 seconds (Warm-up)
## Chain 4:                0.172 seconds (Sampling)
## Chain 4:                0.343 seconds (Total)
## Chain 4:
## Warning: There were 32 divergent transitions after warmup. See
## https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
## to find out why this is a problem and how to eliminate them.
## Warning: Examine the pairs() plot to diagnose sampling problems
## Warning: Bulk Effective Samples Size (ESS) is too low, indicating posterior means and medians may be unreliable.
## Running the chains for more iterations may help. See
## https://mc-stan.org/misc/warnings.html#bulk-ess
## Warning: Tail Effective Samples Size (ESS) is too low, indicating posterior variances and tail quantiles may be unreliable.
## Running the chains for more iterations may help. See
## https://mc-stan.org/misc/warnings.html#tail-ess


結果(95%予測区間)

mcmc_intervals(
  mcmc_result_pred,
  regex_pars = c("y_next_hat."),
  prob=0.8,
  prob_outer=0.95
)


結果(予測分布)

mcmc_areas(
  mcmc_result_pred,
  pars = c("y_next_hat[1]","y_next_hat[5]"),
  prob=0.6,
  prob_outer=0.99
)




6. brmsによるお手軽推定

library(brms)

df <- data.frame(x_obs,y_obs)

simple_lm_brms <- brm(
  formula = y_obs~x_obs,
  family = gaussian(link="identity"),  #期待値はalpha+beta*x,誤差項は正規分布
  data = df,
  seed=1
)
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 1).
## Chain 1: 
## Chain 1: Gradient evaluation took 5.9e-05 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 0.59 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1: 
## Chain 1: 
## Chain 1: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 1: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 1: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 1: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 1: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 1: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 1: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 1: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 1: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 1: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 1: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 1: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 1: 
## Chain 1:  Elapsed Time: 0.053 seconds (Warm-up)
## Chain 1:                0.04 seconds (Sampling)
## Chain 1:                0.093 seconds (Total)
## Chain 1: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 2).
## Chain 2: 
## Chain 2: Gradient evaluation took 2.3e-05 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 0.23 seconds.
## Chain 2: Adjust your expectations accordingly!
## Chain 2: 
## Chain 2: 
## Chain 2: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 2: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 2: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 2: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 2: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 2: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 2: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 2: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 2: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 2: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 2: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 2: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 2: 
## Chain 2:  Elapsed Time: 0.082 seconds (Warm-up)
## Chain 2:                0.052 seconds (Sampling)
## Chain 2:                0.134 seconds (Total)
## Chain 2: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 3).
## Chain 3: 
## Chain 3: Gradient evaluation took 1.4e-05 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 0.14 seconds.
## Chain 3: Adjust your expectations accordingly!
## Chain 3: 
## Chain 3: 
## Chain 3: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 3: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 3: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 3: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 3: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 3: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 3: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 3: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 3: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 3: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 3: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 3: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 3: 
## Chain 3:  Elapsed Time: 0.071 seconds (Warm-up)
## Chain 3:                0.065 seconds (Sampling)
## Chain 3:                0.136 seconds (Total)
## Chain 3: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 4).
## Chain 4: 
## Chain 4: Gradient evaluation took 2.4e-05 seconds
## Chain 4: 1000 transitions using 10 leapfrog steps per transition would take 0.24 seconds.
## Chain 4: Adjust your expectations accordingly!
## Chain 4: 
## Chain 4: 
## Chain 4: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 4: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 4: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 4: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 4: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 4: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 4: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 4: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 4: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 4: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 4: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 4: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 4: 
## Chain 4:  Elapsed Time: 0.051 seconds (Warm-up)
## Chain 4:                0.054 seconds (Sampling)
## Chain 4:                0.105 seconds (Total)
## Chain 4:
plot(simple_lm_brms)

#pred
new_df <- data.frame(x_obs = 10.5)
set.seed(1)
predict(simple_lm_brms,new_df)
##      Estimate Est.Error     Q2.5    Q97.5
## [1,] 19.82394  4.066577 11.75225 28.37005




参考文献



豊田秀樹 編著(2015)「基礎からのベイズ統計学・ハミルトニアンモンテカルロ法による実践的入門」朝倉書店、第3章 馬場 真哉(2019)「実践Data Scienceシリーズ RとStanではじめる ベイズ統計モデリングによるデータ分析入門」講談社、第3部第2章、第3部第3章